package br.uff.probabilidade.applet;

import java.awt.Color;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;

import java.util.Random;
import java.util.Vector;

import javax.swing.JOptionPane;
import javax.swing.text.Position;

import sun.security.x509.NetscapeCertTypeExtension;

import br.uff.probabilidade.modelo.Evento;
import br.uff.probabilidade.modelo.Legenda;
import br.uff.probabilidade.modelo.arvore.Nivel;
import br.uff.probabilidade.modelo.arvore.No;
import br.uff.probabilidade.modelo.arvore.Opcao;
import br.uff.probabilidade.modelo.configuracao.Configuracao;
import br.uff.probabilidade.modelo.configuracao.Layout;

public class Arvore extends Atividade{	
	
	private Configuracao configuracao;
	
	private static int NUM_EVENTOS = 4;
	private static int NUM_NIVEIS = 4;
		
	private Vector niveis = new Vector();	
	
	private String historia=""; 
	private int[] ordemNiveis = new int[this.NUM_NIVEIS]; //Os niveis escolhidos pelos usuarios
	
	
	private boolean escolheu = false;
	//Para o javascript
	
	public String getHistoria(){
		return this.historia;
	}
	public boolean hasEscolheu(){
		return this.escolheu;
	}
	
	public void escolheOrdem(String ordemNiveis){
		if(escolheu)return;
		String[] arrayAsString = ordemNiveis.split(" ");
		for(int i=0;i<this.ordemNiveis.length;i++){
			System.out.println(arrayAsString[i]);
			this.ordemNiveis[i] = Integer.parseInt(arrayAsString[i]);
		}			
		this.escolheu = true;
	}
	
	public int qntNiveis(){
		return this.NUM_NIVEIS;
	}
	
	public void escolheOpcao(int nivel,int opcao){
		if(!this.escolheu)return ;
		this.getNivelAt(nivel).getOpcaoAt(opcao).setEscolhida(true);			
		this.getNivelAt(nivel).setShowing(true);
		
		if(nivel+1<this.NUM_NIVEIS){
			for(int i=0;i<this.getNivelAt(nivel+1).qntOpcoes();i++){
				this.getNivelAt(nivel).getOpcaoAt(opcao).adicionaFilho(this.getNivelAt(nivel+1).getOpcaoAt(i));				
			}
		}
		this.atualiza();
	}
	
	public int qntOpcoes(int nivel){
		if(!this.escolheu)return this.getNivelCerto(nivel).qntOpcoes();
		return this.getNivelAt(nivel).qntOpcoes();
	}	

	
	public synchronized String getNomeOpcao(int nivel,int opcao){
		if(!this.escolheu)return this.getNivelCerto(nivel).getOpcaoAt(opcao).getNome();
		return this.getNivelAt(nivel).getOpcaoAt(opcao).getNome();		
	}
           
	public String getNomeNivel(int nivel){
		if(!this.escolheu)return this.getNivelCerto(nivel).getDescricao();
		return this.getNivelAt(nivel).getDescricao();	
	}
	
	public float getProbabilidadeOpcao(int nivel,int opcao){
		if(!this.escolheu)return -1;
		return this.getNivelAt(nivel).getOpcaoAt(opcao).getProbabilidade();
	}
	//Fim das funcoes do javascript
	
	
	public void addNivel(Nivel nivel){
		this.niveis.add(nivel);
	}
	
	public Nivel getNivelAt(int i){
		return (Nivel)this.niveis.get(this.ordemNiveis[i]);
	}
	
	public Nivel getNivelCerto(int i){
		return (Nivel)this.niveis.get(i);
	}

	@Override
	public void desenha(Graphics g) {
		for(int i=0;i<this.NUM_NIVEIS;i++){
			for(int j=0;j<this.getNivelAt(i).qntOpcoes();j++){
				if(this.getNivelAt(i).isShowing())
					if(this.getNivelAt(i).getOpcaoAt(j).isEscolhida()){
						this.getNivelAt(i).getOpcaoAt(j).desenha(g);
					}
		
			}
		}
	}
	
	private void configura() throws Exception{
		this.configuracao =  new Configuracao(this.getCodeBase().getPath()+"arvore_conf.txt");
		this.configuracao.setLayout();
		NUM_EVENTOS = Integer.parseInt(this.configuracao.getParametrosOfCampo("numero_de_eventos")[0]);			
		
		NUM_NIVEIS = Integer.parseInt(this.configuracao.getParametrosOfCampo("numero_de_niveis")[0]);
		this.historia = this.configuracao.getParametrosOfCampo("historia")[0];
		String[] params;
		Nivel nivel;
		int[] posicoes = this.ordenaNiveis();
		for(int i=0;i<NUM_NIVEIS;i++){
			params = this.configuracao.getParametrosOfCampo("nivel_"+(i+1));
			System.out.println("nivel_"+posicoes[i]);
			nivel = new Nivel(params[0]);			
			for(int j=1;j<params.length;j=j+2){
				System.out.println("\t"+params[j]+" , "+Float.parseFloat(params[j+1].replace(',', '.')));
				nivel.addOpcao(params[j],Float.parseFloat(params[j+1].replace(',', '.')),new Point(this.posicao.x,this.posicao.y));				
			}			
			this.addNivel(nivel);
		}			
	}
	
	@Override
	public void init() {
		this.addMouseListener(this);
		super.setDefaultAttributes();
		super.posicao = new Point(72,this.getHeight()/2);
		super.setDoubleBuffered(true);
		try{
			this.configura();
		}catch(Exception e){
			e.printStackTrace();
			System.exit(1);
		}			

	}
	
	private int[] ordenaNiveis(){
		int[] posicoes = new int[NUM_NIVEIS];
		for(int i=0;i<NUM_NIVEIS;i++){
			posicoes[i]=i;
		}
		
		int i=0,qnt=0,tmp;
		while(qnt<NUM_NIVEIS){			
			i = new Random().nextInt(NUM_NIVEIS-qnt);
			System.out.println("Sorteio="+i);
			tmp = posicoes[NUM_NIVEIS-1];
			posicoes[NUM_NIVEIS-1] = posicoes[i];
			posicoes[i] = tmp;
			qnt++;
		}
		
		for(int j=0;j<posicoes.length;j++){
			System.out.println(posicoes[j]);
		}
		
		return posicoes;
	}

	@Override
	public void paint(Graphics g) {
		this.desenha(g);
		
	}

	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

}
